package evemanutool.gui.general.components;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
@SuppressWarnings("serial")
public class AnimatedLabel extends JPanel implements ActionListener {
//Constants.
private static final int RIGHT_TEXT_MARGIN = 10;
private static final double SPEED_FACTOR = 0.3;
private static final double BASE_SPEED = 0.8;
// private static final double SPEED_FACTOR = 0.3;
// private static final double BASE_SPEED = 1.7;
//Text coordinates.
private double x; //Double to make animation smoother.
private double y;
//Text color.
private int a = 255; //Alpha.
//Text.
private String text = "";
//Animation.
private Timer animIn;
private Timer animOut;
private int textWidth;
private boolean textShowing;
//Object locks.
private final Object textShowLock = new Object();
private Object textLock = new Object();
public AnimatedLabel(int sizeX, int sizeY) {
this.setOpaque(false);
this.setTextShowing(false);
this.setDoubleBuffered(true);
this.textWidth = RIGHT_TEXT_MARGIN;
animIn = new Timer(30, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// x -= BASE_SPEED + (x - (getWidth() - textWidth)) * SPEED_FACTOR;
y -= BASE_SPEED + (y - ((getHeight() + getFont().getSize()) / (double) 2)) * SPEED_FACTOR;
// a = (int) ALPHA_MAX * (x - minX));
// if (x > (getWidth() - textWidth)) {
// setTextShowing(true);
// animIn.stop();
// }
if (y < (int) (((getHeight() + getFont().getSize()) / (double) 2) + 0.5)) {
setTextShowing(true);
animIn.stop();
}
repaint();
}
});
animOut = new Timer(30, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// x += BASE_SPEED + (x - (getWidth() - textWidth)) * SPEED_FACTOR;
y -= BASE_SPEED + (((getHeight() + getFont().getSize()) / (double) 2) - y) * SPEED_FACTOR;
// a = (int) ALPHA_MAX * (x - minX));
if (y < 0) {
setTextShowing(false);
animOut.stop();
}
// if (x > getWidth()) {
// setTextShowing(false);
// animOut.stop();
// }
repaint();
}
});
}
/*
* Returns true if text is showing.
*/
public boolean textShowing() {
synchronized (textShowLock ) {
return textShowing;
}
}
public void setTextShowing(boolean textShowing) {
synchronized (textShowLock) {
this.textShowing = textShowing;
}
}
public boolean animateIn() {
if ( !animIn.isRunning() &&
!animOut.isRunning() &&
!textShowing()) {
animIn.start();
return true;
}
return false;
}
public boolean animateOut() {
if ( !animIn.isRunning() &&
!animOut.isRunning() &&
textShowing()) {
animOut.start();
return true;
}
return false;
}
@Override
public void paint(Graphics g) {
//Correct position.
if ( !animIn.isRunning() &&
!animOut.isRunning()) {
if (textShowing()) {
y = (int) (((getHeight() + getFont().getSize()) / (double) 2) + 0.5);
// x = getWidth() - textWidth;
} else {
y = getHeight() + getFont().getSize();
// x = getWidth();
}
}
//Set color.
Color c = new Color(0, 0, 0, a);
g.setColor(c);
//Set x.
x = getWidth() - textWidth;
// y = (int) (((getHeight() + getFont().getSize()) / (double) 2) + 0.5);
// System.out.println("x:" + (int) (x + 0.5) + " y:" + (int) (y + 0.5));
//Draw text.
g.drawString(getText(), (int) (x + 0.5), (int) (y + 0.5));
}
@Override
public void actionPerformed(ActionEvent arg0) {
}
public void exit() {
animIn.stop();
animOut.stop();
}
public String getText() {
synchronized (textLock) {
return text;
}
}
public void setText(String text) {
synchronized (textLock) {
//Set text starting and end values.
textWidth = getFontMetrics(getFont()).stringWidth(text) + RIGHT_TEXT_MARGIN;
//Set text.
if (text != null) {
this.text = text;
}
}
}
}